function runTask(task) {
  return new Promise((resolve) => {
    _run(task, resolve)
  })
}

// requestIdleCallback 存在兼容问题 safari 目前不支持
function _run(task, callback) {
  requestIdleCallback((deadline) => {
    if (deadline.timeRemaining() > 0) {
      // 当前渲染帧还有时间执行的时候
      task()
      callback()
    } else {
      // 当前渲染帧没有时间执行的时候

      _run(task, callback)
    }
  })
}

/**
 * 兼容性更好方式 1帧16.7ms
 * @param {*} task  任务
 * @param {*} callback
 */
function _run_compatibility(task, callback) {
  const start = performance.now()
  requestAnimationFrame(() => {
    if (performance.now() - start < 16.7) {
      // 当前渲染帧还有时间执行的时候
      task()
      callback()
    } else {
      // 当前渲染帧没有时间执行的时候

      _run_compatibility(task, callback)
    }
  })
}
